//
// Created by Administrator on 2017/7/12 0012.
//
#include <string.h>
#include "utils/transform.h"

char* String2ByteArr(JNIEnv *env, jobject jobj, jstring str)
{
    char *c;
    //载入java/lang/String类
    jclass clzz = (*env)->FindClass(env,"java/lang/String");
    jstring strencode = (*env)->NewStringUTF(env,"UTF-8");  // 声明一个"utf-8"编码的java字符串
    //得到方法ID (Ljava/lang/String;)[B)为getBytes方法的签名 如何得到下面会介绍
    jmethodID method = (*env)->GetMethodID(env,clzz, "getBytes", "(Ljava/lang/String;)[B");
    //为什么strencode不直接换成"GB2312"因为这个参数是java方法
    jbyteArray ja = (jbyteArray) (*env)->CallObjectMethod(env,str, method, strencode);
    jsize length = (*env)->GetArrayLength(env,ja);
    jbyte *jb = (*env)->GetByteArrayElements(env,ja, 0);//得到一个指向ja的Java数组元素的C指针
    if (length > 0)
    {
        c = (char *) malloc(length + 1);//多创建1个字节存放0，字符串结尾以\0为标志
        memcpy(c, jb, length);
        c[length] = 0;//到这地方Java中传进来的str字符串转换成了C语言中的字符串
    }
    (*env)->ReleaseByteArrayElements(env,ja, jb, 0);//释放相关指针
    return c;//c是C语言中的字符串形式 用NewStringUTF转换为java形式并返回
//    return env->NewStringUTF(c);//c是C语言中的字符串形式 用NewStringUTF转换为java形式并返回
}

jstring charToString(JNIEnv *envPtr, char *src)
{
    JNIEnv env = *envPtr;

    jsize len = strlen(src);
    jclass clsstring = env->FindClass(envPtr, "java/lang/String");
    jstring strencode = env->NewStringUTF(envPtr, "UTF-8");
    jmethodID mid = env->GetMethodID(envPtr, clsstring, "<init>", "([BLjava/lang/String;)V");
    jbyteArray barr = env->NewByteArray(envPtr, len);
    env->SetByteArrayRegion(envPtr, barr, 0, len, (jbyte *) src);

    return (jstring) env->NewObject(envPtr, clsstring, mid, barr, strencode);
}
